#-*- coding: utf8 -*-
from tutor.script import *
from tutor.plugin.maple import *

# meta-informação
meta(author       = 'Fábio Mendes',
     creationdate = datetime(2010, 10, 24),
     status       = 'testing',
     difficulty   = 'hard',
     time         = 10,
     itemtype     = 'test')

# cria função
g = oneof(M.sin, M.cos)
w = M.Pi * oneof(1,2,3,4,6)/4
u, v = sample([x,y], 2)
func = simplify(u * g(w * v))
f = M.unapply(func, x, y)
D = M.D

# escolhe ponto
x0 = randint(-2,2)
y0 = randint(-2,2)
P0 = (x0, y0)
assert (x0 != 0) or (y0 != 0)

# expande em torno de x0, y0
expansion = lambda x0, y0, x1, y1: f(x0, y0) \
       + D[1](f)(x0, y0) * (x - x1) + D[2](f)(x0, y0) * (y - y1) \
       + D[1](D[1](f))(x0, y0) * (x - x1)**2/2 + D[2](D[2](f))(x0, y0) * (y - y1)**2/2 \
       + D[1](D[2](f))(x0, y0) * (y - y1) * (x - x1)

# resposta correta
ans_ok = expansion(x0, y0, x0, y0)
    
# expande na origem
ans_e0 = expansion(0, 0, 0, 0)

# calcula derivadas na origem
ans_e1 = expansion(0, 0, x0, y0)

# calcula derivadas em x, y
ans_e2 = expansion(x, y, x0, y0)

# esquece do termo com derivada cruzada
ans_e3 = ans_ok - D[1](D[2](f))(x0, y0) * (y - y0) * (x - x0)

question(u'Qual é a aproximação de Taylor de segunda ordem para a função\n\n'
          '         $$f(x,y)=', func, ',$$\n\n'
          'em torno do ponto $', P0, '$?')
multiplechoice()
print('params: g=%s, w=%s, P0=%s' % (g, w, P0))

# choice: (a)
choice_eq(1, ans_ok)
explanation('Escolha correta!') 

# choice: (b)
choice_eq(0.5, ans_e3)
explanation('Se esqueceu do termo com derivada cruzada na fórmula de Taylor.') 

# choice: (c)
choice_eq(0.25, ans_e0)
explanation('Calculou a expansão correta na origem.') 

# choice: (d)
choice_eq(0, ans_e1)
explanation('Avaliou as derivadas na origem.') 

# choice: (e)
choice_eq(0, simplify(M.expand(ans_e2)))
explanation('Esqueceu de substituir os pontos no cálculo das derivadas.') 

end()